home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / zilog / zilogdma.c < prev    next >
C/C++ Source or Header  |  1996-04-07  |  8KB  |  308 lines

  1. /*
  2.  *
  3.  *
  4.  *        Programme d‚monstration DMA- Terminal entre deux machines
  5.  *
  6.  *        Ce programme transfŠre … 19200 Bits/Sec. en 8 Bits Parit‚ Paire
  7.  *        1 bit de Stop.
  8.  *
  9.  *        Il opŠre en mode DMA l'‚mission et re‡oit sous interruptions.
  10.  *
  11.  *
  12.  *        FunShip (c) 28 Avril 1995 - ATARI Falcon030
  13.  *
  14.  */
  15.  
  16.  
  17. #include <stdio.h>
  18. #include <tos.h>
  19.  
  20. /*
  21.  *    Proc‚dure d'interruption
  22.  */
  23.  
  24. extern    void ItSubRoutine(void);
  25.  
  26. #define    TRUE        1
  27. #define    FALSE        0
  28.  
  29. #define    SCC_CONTROLA    0xFFFF8C81L        /* Registers Z85C30's addresses*/
  30. #define    SCC_DATAA    0xFFFF8C83L        /* A Channel */
  31. #define    SCC_CONTROLB    0xFFFF8C85L        /* B Channel */
  32. #define    SCC_DATAB    0xFFFF8C87L
  33.  
  34. #define    DMAADR4        0xFFFF8C01L        /* Buffer DMA base addresse: MSB */
  35. #define    DMAADR3        0xFFFF8C03L
  36. #define    DMAADR2        0xFFFF8C05L
  37. #define    DMAADR1        0xFFFF8C07L        /* Byte LSB of addresse */
  38. #define    DMACOUNT4    0xFFFF8C09L        /* Number of bytes to transfered: MSB */
  39. #define    DMACOUNT3    0xFFFF8C0BL
  40. #define    DMACOUNT2    0xFFFF8C0DL
  41. #define    DMACOUNT1    0xFFFF8C0FL        /* Byte LSB of bytes count */
  42. #define    DMAREGISTERH    0xFFFF8C10L        /* Assembly register */
  43. #define    DMAREGISTERL    0xFFFF8C12L
  44. #define    DMACONTROL    0xFFFF8C14L        /* DMA Control register */
  45.  
  46. #define    IT_VECTOR    0x82            /* A free interrupt vector user */
  47.  
  48. #define    WR1        1
  49. #define    WR2        2
  50. #define    WR3        3
  51. #define    WR4        4
  52. #define    WR5        5
  53. #define    WR6        6
  54. #define    WR7        7
  55. #define    WR8        8
  56. #define    WR9        9
  57. #define    WR10        10
  58. #define    WR11        11
  59. #define    WR12        12
  60. #define    WR13        13
  61. #define    WR14        14
  62. #define    WR15        15
  63.  
  64. #define    RR1        1
  65. #define    RR2        2
  66. #define    RR3        3
  67. #define    RR10        10
  68. #define    RR12        12
  69. #define    RR13        13
  70. #define    RR15        15
  71.  
  72. void     (*OldVector)();                /* Old It vector */
  73. int    Echange;                /* to exchange datas with IT prg */
  74.  
  75. /*
  76.  *        Primitives d'accŠs aux registres du ZILOG
  77.  */
  78.  
  79. void SCCPut(int Canal,int Value,int Register)
  80. /*
  81.     This procedure put a value in any register of Z85C30
  82.     
  83.     Inputs:    Value is the byte value to store
  84.         Register is the number of target register
  85.     Outputs:None
  86. */
  87. {
  88.   if(Canal == 'B')
  89.   {
  90.     *(char *)SCC_CONTROLB    = Register;
  91.     *(char *)SCC_CONTROLB    = Value;
  92.   }
  93.   else
  94.   {
  95.     *(char *)SCC_CONTROLA    = Register;
  96.     *(char *)SCC_CONTROLA    = Value;
  97.   }
  98. }
  99.  
  100. int SCCGet(int Channel, int Register)
  101. /*
  102.     This function read a value from any register of Z85C30
  103.     
  104.     Inputs:    Register is the number of source register
  105.     Outputs:Return the register's value
  106. */
  107. {
  108.   int    Value;
  109.   
  110.   if(Channel == 'B')
  111.   {
  112.     *(char *)SCC_CONTROLB    = Register;
  113.     Value            = *(char *)SCC_CONTROLB;
  114.   }
  115.   else
  116.   {
  117.     *(char *)SCC_CONTROLA    = Register;
  118.     Value            = *(char *)SCC_CONTROLA;
  119.   }
  120.   return(Value);
  121. }
  122.  
  123. /*
  124.  *    Primitives plus haut niveaux: Initialisation, Emission, Test et R‚ception
  125.  */
  126.  
  127. void SCCInit(int Channel)
  128. /*
  129.     Initialize the chip in 19200 Bits/Sec, Parity Even, 1 Stop bit and 8 Bits Data
  130.     No interrupts required.
  131. */
  132. {
  133.   SCCPut(Channel,0x00,WR3);            /* Receiver Off */
  134.   SCCPut(Channel,0x00,WR5);            /* Transceiver Off */
  135.   SCCPut(Channel,0xD4,WR1);            /* ITs and DMA mode */
  136.   SCCPut(Channel,IT_VECTOR,WR2);        /* Interrupt Vector */
  137.   SCCPut(Channel,0x47,WR4);            /* Async. 1 Stop parity Even and Clk/16 */
  138.   SCCPut(Channel,0x08,WR9);            /* Enable interrupts */
  139.   SCCPut(Channel,0x00,WR10);            /* NRZ Code mode -> RS232C */
  140.   SCCPut(Channel,0x50,WR11);            /* RxClk = TxClk = BR */
  141.   SCCPut(Channel,0x00,WR15);            /* No special interrupts */
  142.   SCCPut(Channel,0xA3,WR14);            /* BR -> PCLK */
  143.   SCCPut(Channel,0x0B,WR12);            /* Divide value LSB */
  144.   SCCPut(Channel,0x00,WR13);            /* Divide value MSB => 19200 Bauds */
  145.  
  146.   OldVector = Setexc(IT_VECTOR,ItSubRoutine);      /* Install new interrupt handler*/
  147.   
  148.   SCCPut(Channel,0xC1,WR3);            /* 8 Bits and enable receiver */
  149.   SCCPut(Channel,0xE8,WR5);            /* 8 Bits and ebale transceiver */
  150. }
  151.  
  152. void SCCStop(int Channel)
  153. /*
  154.     Disable the Zilog in receive and transmit mode. Delete our own It also.
  155. */
  156. {
  157.   SCCPut(Channel,0x00,WR3);            /* Receiver Off */
  158.   SCCPut(Channel,0x00,WR5);            /* Transceiver Off */
  159.   SCCPut(Channel,0x00,WR9);            /* no more ITs */  
  160. }
  161.  
  162. void SCCOut(int Channel, int Byte)
  163. /*
  164.     Send a character trough the output data register.
  165. */
  166. {
  167.   if(Channel == 'B')
  168.     *(char *)SCC_DATAB = Byte;
  169.   else
  170.     *(char *)SCC_DATAA = Byte;
  171. }
  172.  
  173. int SCCReceived(int Channel)
  174. /*
  175.     Return True if a character is received else false. A character is arrived if
  176.     the bit 0 of RR0 is set.
  177. */
  178. {
  179.   int    Etat;
  180.   
  181.   if(Channel == 'B')
  182.     Etat = *(char *)SCC_CONTROLB & 0x01;
  183.   else
  184.     Etat = *(char *)SCC_CONTROLA & 0x01; 
  185.   return(Etat); 
  186. }
  187.  
  188. int SCCIn(int Channel)
  189. /*
  190.     Get a character from the input data register.
  191. */
  192. {
  193.   if(Channel == 'B')
  194.     return(*(char *)SCC_DATAB);
  195.   else
  196.     return(*(char *)SCC_DATAA);
  197. }
  198.  
  199. void SCCDmaInit(void *Buffer, unsigned long Count)
  200. /*
  201.     
  202. */
  203. {
  204. /*
  205.   printf("DMA: debut\n");
  206.   *(int *)DMACONTROL     |= 0x01;            /* Datas from memory to SCC */
  207.   printf("DMA: Mem -> SCC ok\n");
  208.   *(char *)DMAADR4    = (char)((long)Buffer >> 24);    /* Memory addresse */
  209.   *(char *)DMAADR3    = (char)((long)Buffer >> 16);
  210.   *(char *)DMAADR2    = (char)((long)Buffer >> 8);
  211.   *(char *)DMAADR1    = (char) (long)Buffer;
  212.   printf("DMA: Addresse ok\n");
  213.   *(char *)DMACOUNT4    = (char)((long)Count >> 24);    /* Memory addresse */
  214.   *(char *)DMACOUNT3    = (char)((long)Count >> 16);
  215.   *(char *)DMACOUNT2    = (char)((long)Count >> 8);
  216.   *(char *)DMACOUNT1    = (char) (long)Count;  
  217.   printf("DMA: Count ok\n");
  218. */
  219.   printf("%X\n",*(int *)DMACONTROL);            /* Datas from memory to SCC */
  220.   printf("DMA: Mem -> SCC ok\n");
  221.   printf("%X\n",*(char *)DMAADR4);    /* Memory addresse */
  222.   printf("%X\n",*(char *)DMAADR3);
  223.   printf("%X\n",*(char *)DMAADR2);
  224.   printf("%X\n",*(char *)DMAADR1);
  225.   printf("DMA: Addresse ok\n");
  226.   printf("%X\n",*(char *)DMACOUNT4);    /* Memory addresse */
  227.   printf("%X\n",*(char *)DMACOUNT3);
  228.   printf("%X\n",*(char *)DMACOUNT2);
  229.   printf("%X\n",*(char *)DMACOUNT1); 
  230. }
  231.  
  232. void SCCDmaStart(void)
  233. /*
  234.     This procedure send datas in DMA mode.
  235. */
  236. {
  237.   *(int *)DMACONTROL    |= 0x03;              /* Start DMA */
  238. }
  239.  
  240. /*
  241.  *    Programme principal de test
  242.  */
  243.  
  244. int main(void)
  245. {
  246.   unsigned int    Character;
  247.   int        *OldPile;
  248.   int        Colonne;
  249.   char        Buffer[4];
  250.     
  251.   printf("\033E");
  252.   printf("\t\tZILOG Z85C30: Reception by Interrupt program\n");
  253.   printf("\t\tPress ESC to exit\n");
  254.   printf("\t\t============================================\n\n");
  255.  
  256.   printf("Z85C30 programmed at 19200 bits/s, Parity even, 1 Stop bit and 8 bits data\n");
  257.   printf("On its B Channel\n\n");
  258.   
  259.   OldPile    = (int *)Super(0L);        /* Go to supervisor mode */
  260.  
  261.   SCCDmaInit(Buffer,4L);  
  262.   SCCInit('B');                    /* Initialize the Zilog */
  263.   Colonne = 1;
  264.   Echange = 0;
  265.   Character = (unsigned char)Crawio(0xFF);    /* Reading a character */
  266.   while(Character != 27)
  267.   {
  268.     if(Character != 0)                /* a key is pressed */
  269.     {
  270.       if(Colonne < 80)
  271.         Colonne++;
  272.       else                    /* Go back top line */
  273.       {
  274.         Colonne = 1;
  275.         printf("\n");
  276.       }
  277.       printf("%c",Character);
  278.       Buffer[0] = Character;
  279.       Buffer[1] = Character;
  280.       Buffer[2] = Character;
  281.       Buffer[3] = Character;
  282.       printf("DMA mode starting\n");
  283. /*      SCCDmaStart(); */
  284.       printf("DMA send ending\n"); 
  285. /*      SCCOut('B',Character);*/            /* Sending its ASCII code */
  286.     }
  287.     if(Echange != 0)                /* If a character is arrived */
  288.     {
  289.       if(Colonne < 80)
  290.         Colonne++;
  291.       else                    /* Go back top line */
  292.       {
  293.         Colonne = 1;
  294.         printf("\n");
  295.       }
  296.       printf("%c",Echange);            /* Display it */
  297.       Echange = 0;
  298.     }
  299.     Character = (unsigned char)Crawio(0xFF);    /* Test another key */
  300.   }
  301.   SCCStop('B');                    /* Stop channel B */
  302.  
  303.   Setexc(IT_VECTOR,OldVector);            /* Restore old IT Vector */
  304.   Super(OldPile);                /* Go back user mode */
  305.   return(0);                    /* Return code for the Shell */
  306. }
  307.  
  308.